package com.wolfeyes.framework.springsecurity.domain.model;

import com.wolfeyes.system.domain.SysUser;

import lombok.Data;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.Set;

/**
 * @description 自定义的登录用户身份权限对象
 * @author yanyljava
 * @create 2020-09-04 16:39
 */
@Data
public class CustomizeUserDetails implements UserDetails {

	/**
	 * @description 串行版本标识
	 */
	private static final long serialVersionUID = 6903915264571237673L;

	/**
	 * 用户唯一标识
	 */
	private String token;

	/**
	 * 登陆时间
	 */
	private Long loginTime;

	/**
	 * 过期时间
	 */
	private Long expireTime;

	/**
	 * 登录IP地址
	 */
	private String ipaddr;

	/**
	 * 登录地点
	 */
	private String loginLocation;

	/**
	 * 浏览器类型
	 */
	private String browser;

	/**
	 * 操作系统
	 */
	private String os;

	/**
	 * 权限列表
	 */
	private Set<String> permissions;

	/**
	 * 用户信息
	 */
	private SysUser user;
	
	/**
	 * @title 权限+角色集合
	 */
	private Collection<? extends GrantedAuthority> authorities;
	

	public String getToken()
	{
		return token;
	}

	public void setToken(String token)
	{
		this.token = token;
	}

	public CustomizeUserDetails()
	{
	}

	public CustomizeUserDetails(SysUser user, Set<String> permissions)
	{
		this.user = user;
		this.permissions = permissions;
	}

	@JsonIgnore
	@Override
	public String getPassword()
	{
		return user.getPassword();
	}

	@Override
	public String getUsername()
	{
		return user.getUserName();
	}

	/**
	 * 账户是否未过期,过期无法验证
	 */
	@JsonIgnore
	@Override
	public boolean isAccountNonExpired()
	{
		return true;
	}

	/**
	 * 指定用户是否解锁,锁定的用户无法进行身份验证
	 *
	 * @return
	 */
	@JsonIgnore
	@Override
	public boolean isAccountNonLocked()
	{
		return true;
	}

	/**
	 * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
	 *
	 * @return
	 */
	@JsonIgnore
	@Override
	public boolean isCredentialsNonExpired()
	{
		return true;
	}

	/**
	 * 是否可用 ,禁用的用户不能身份验证
	 *
	 * @return
	 */
	@JsonIgnore
	@Override
	public boolean isEnabled()
	{
		return true;
	}

	public Long getLoginTime()
	{
		return loginTime;
	}

	public void setLoginTime(Long loginTime)
	{
		this.loginTime = loginTime;
	}

	public String getIpaddr()
	{
		return ipaddr;
	}

	public void setIpaddr(String ipaddr)
	{
		this.ipaddr = ipaddr;
	}

	public String getLoginLocation()
	{
		return loginLocation;
	}

	public void setLoginLocation(String loginLocation)
	{
		this.loginLocation = loginLocation;
	}

	public String getBrowser()
	{
		return browser;
	}

	public void setBrowser(String browser)
	{
		this.browser = browser;
	}

	public String getOs()
	{
		return os;
	}

	public void setOs(String os)
	{
		this.os = os;
	}

	public Long getExpireTime()
	{
		return expireTime;
	}

	public void setExpireTime(Long expireTime)
	{
		this.expireTime = expireTime;
	}

	public Set<String> getPermissions()
	{
		return permissions;
	}

	public void setPermissions(Set<String> permissions)
	{
		this.permissions = permissions;
	}

	public SysUser getUser()
	{
		return user;
	}

	public void setUser(SysUser user)
	{
		this.user = user;
	}

	/**
	 * @title 获取用户拥有的权限和角色
	 */
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		
		return authorities;
	}
	
	/**
	 * @title 添加用户拥有的权限和角色
	 */
	public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
		this.authorities = authorities;
	}
	
}


